package com.example.lcpractice.datastructure;

import lombok.*;

/**
 * 二叉树节点
 */
@Data
@NoArgsConstructor
public class TreeNode {

    //节点的权
    public int val;
    //左儿子
    public TreeNode left;
    //右儿子
    public TreeNode right;

    /**
     * 二叉树的创建
     */
    //构造方法，传入一个值
    public TreeNode(int val) {
        this.val = val;
    }




    /**
     * 二叉树的遍历
     * 前序遍历(根，左，右)
     */
    public void frontShow() {
        //先遍历当前节点(根节点);
        System.out.print(val);
        //左节点
        if (left != null) {
            left.frontShow();
        }
        //右节点
        if (right != null) {
            right.frontShow();
        }

    }

    /**
     * 中序遍历(左，根，右)
     */
    public void midShow() {
        //先遍历左节点
        if (left != null) {
            left.midShow();
        }
        //在遍历当前节点(根节点);
        System.out.print(val);
        //最后右节点
        if (right != null) {
            right.midShow();
        }

    }


    /**
     * 后序遍历(左，右，根)
     */
    public void afterShow() {
        //先左节点
        if (left != null) {
            left.afterShow();
        }
        //在右节点
        if (right != null) {
            right.afterShow();
        }
        //最后遍历当前节点(根节点);
        System.out.print(val);
    }


    /**
     * 设置左孩子
     * @param lNode 左孩子
     */
    public void setLeft(TreeNode lNode) {
        this.left = lNode;
    }

    /**
     * 设置右孩子
     * @param rNode 右孩子
     */
    public void setRight(TreeNode rNode) {
        this.right = rNode;
    }

    /**
     * 二叉树的前序查找
     */
    public TreeNode frontSearch(int i) {

        TreeNode target = null;
        //对比当前节点的值
        if (this.val == i) {
            return this;
            //当前节点中的值不是要查找的
        } else {
            //查找左节点
            if (left != null) {
                //有可能可以查到，有可能查找不到，查不到的话，target还是null
                target = left.frontSearch(i);
            }
            //如果不为空，则查找成功
            if (target != null) {
                return target;
            }
            //查找右节点
            if (right != null) {
                target = right.frontSearch(i);
            }
        }
        return target;

    }

    /**
     * 二叉树的删除子树
     */
    public void delete(int i) {
        TreeNode parent = this;
        //判断左孩子
        if (parent.left != null && parent.left.val == i) {
            parent.left = null;
            return;
        }
        //判断右孩子
        if (parent.right != null && parent.right.val == i) {
            parent.right = null;
            return;
        }
        //如果都不是,递归检查并删除左孩子
        parent = left;
        if (parent != null) {
            parent.delete(i);
        }
        //递归检查并删除右孩子
        parent = right;
        if (parent != null) {
            parent.delete(i);
        }

    }

}
